\documentclass[a4paper, 12pt]{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian,english]{babel}
\usepackage[pdftex,unicode]{hyperref}
\usepackage[pdftex]{graphicx}

\begin{document}
KOT.Parser

Я создал первый проект продукта KOT - это KOT.Parser. Его задача читать тело метода и генерировать выражения-объекты, которые уже являются частью DOM'а. Также в процессе разбора парсер отвечает за создание autocomplete (он же intellisense), мы будем называть это guess. 

Теперь немного архитектуры. Любую операцию с текстом можно разбить на две атомарные: удаление и добавление символа, - такое разделение диктует структуру парсера и всего процесса разборки. Пусть существует текст и он уже разобран, то есть ему уже сопоставленны выражения-оъекты в памяти, очевидно, что любой символ текста принадлежит одному выражению-объекту в памяти и притом только одному. Таким образом исходный текст можно представить в следующем виде: [xyz][abc][uvr], где скобки это выржения. Допустим я изменил букву b, то тогда то, что находиться до парсера, смотрит в каком выражение-оъекте произошло изменение и удаляет это выражение, и все последующие, приводя все в следующий вид:[xyz]atcuvr. После этого строка atcuvr и context (некий объект, в котором содержатся все уже разобранные выржения, список классов, доступных из данного метода, и текуший класс) передаются, назовём это мега-парсер, мега-парсеру\footnote{возможно мега-парсер будет принимать текст так же по символьно}. Мега-парсер по этому тексту и контексту вернет список выражений, например, [at][cuvr], и guess. Мега-парсер работает следующем образом, он создает что-то типа монтажного стола или беговой дорожки, число дорожек равно числу выражений в языке C#, например, объявление переменой, оператор for и вызов метода. Далее мега-прасер по символу передает строку каждому парсеру конкретных выражений на беговой дорожке и смотрит за свойством State каждого из них. Значения свойства могут быть следующие (это enum) : Recognizing (те символы, которые переданы, в совокупности не являются выражением, но их можно дополнить до полноценного выражения, например ``string x'', от выражения отделяет только ``;''), Recognized (переданные символы являются выражением) и Broken (переданные символы точно не выражение). Если парсер перешел в состояние Broken, то он удаляется с дорожки. Поэтому рано или поздно останется или один парсер в состоянии Recognized, который сгенерирует выражение-объект, добавит его в список выражений-объектов и начнет все заново, до того, пока все символы не закончаться; или все конкретные парсеры примут состояние Broken в этом случае, будет создан особый тип выражения-объекта (ошибка), который будет содержать весь текст, который не получилось распарсить.

Немного о том, что сделано. Существует два типа выражений и два типа парсеров. Выражение Expression - это любое выражение в системе, ValueExpression это выражение которое, что-либо возвращает, и, соответственно, два вида парсеров: Parser и ValueParser. Это сделано в целях оптимизации. Например, если разбирается выражение присваивание, то после знака равенства может следовать только ValueExpression. Все парсеры предоставляет пул парсеров (ParserPool) он будет инициализироваться в момент загрузки, что позволяет просто добавлять новые выражения в язык, нужно всего лишь предоставить :Expression и :Parser или :ValueExpression и :ValueParser (:x - нечто унаследованное от x).

В качестве первой пары :Expression и :Parser я созрал Declaration, то есть объявление переменной. Можно смотреть на них и делать по подобию.
\end{document}
 
